<?php
/**
 *主wap微信H5调取微信公众号微信支付,回调类
 *主pc微信扫码支付回调
 */
namespace services\models\wxcallback;

use Opwechat\Phppayment\Lib\WxPayNotify;
use Opwechat\Phppayment\Lib\WxPayOrderQuery;
use Opwechat\Phppayment\Lib\WxPayApi;
use services\models\OrderInfo;
use services\models\Order;
use services\models\PayLog;
use Opwechat\Phppayment\CLogFileHandler;
use Opwechat\Phppayment\Log;

//初始化日志
$logHandler= new CLogFileHandler(\Yii::$app->params['root_log']."/weixin/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);
Log::DEBUG("begin notify");
class MainPayNotifyCallBack extends WxPayNotify
{
    //查询订单
    public function Queryorder($transaction_id)
    {
        $input = new WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);
        $result = WxPayApi::orderQuery($input);
        if(array_key_exists("return_code", $result)
            && array_key_exists("result_code", $result)
            && $result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS")
        {
            
            //插入微信返回数据日志
            Log::INFO(json_encode($result));
            
            $out_trade_no = $result['out_trade_no'];//订单号
            
            $order_info = OrderInfo::find()->select(['bestry_uid','status','pay_status','order_amount','order_info_id'])->where(['order_sn'=>$out_trade_no])->one();
            
            if(empty($order_info)) {
                Log::DEBUG($out_trade_no.'查询不到订单信息');
                exit;
            }
            $flag = false;
            // 如果是已经取消的订单，再支付，只更新支付状态，不更新订单状态
            if(!empty($order_info) && $order_info->status == OrderInfo::$STATUS_ORDER_CANCEL  && $order_info->pay_status == OrderInfo::$PAY_STATUS_WAIT) {
               
                //插入日志
                Log::DEBUG($out_trade_no.'是已取消订单，开始修改支付状态，不修改订单状态');
                //开始修改订单状态
                $flag = Order::orderStatusChange($order_info->order_info_id, $order_info->status,OrderInfo::$PAY_STATUS_SUCCESS);
            }
    
            // 如果是待支付状态，更新订单状态，支付状态。
            if(!empty($order_info) &&  $order_info->status  == OrderInfo::$STATUS_ORDER_CREATED && $order_info->pay_status == OrderInfo::$PAY_STATUS_WAIT) {
               
                //插入日志
                Log::DEBUG($out_trade_no.'是待支付订单，开始修改支付状态，修改订单状态');
                
                $flag = Order::orderStatusChangePayed($order_info->order_info_id);
            }
            
            //更新订单成功后插入pay_log记录
            if($flag === true) {
                
                //插入支付日志
                Log::DEBUG($out_trade_no.'开始插入支付pay_log');
                $this->updatePayLog($order_info->order_info_id, $result);
            
            }
    
            return true;
        }
        
        return false;
    }
    
    //重写回调处理函数
    public function NotifyProcess($data, &$msg)
    {
        if(!array_key_exists("transaction_id", $data)){
            $msg = "输入参数不正确";
            return false;
        }
        //查询订单，判断订单真实性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "订单查询失败";
            return false;
        }
    
        return true;
    }
    
    // 更改pay_log信息表
    public function updatePayLog($order_info_id,$data)
    {
        $model = PayLog::findOne(['order_info_id'=>$order_info_id,'order_sn'=>$data['out_trade_no']]);
        if($model) {
            $model->trade_status = $data['trade_state'];//支付状态  成功or失败
            $model->trade_no = $data['transaction_id'];////weixin交易流水号
            $model->notify_time = date("Y-m-d H:i:s"); //通知时间
            $model->out_channel_type = '微信';
            $model->out_channel_inst = '微信';//实际支付渠道
            $model->save();
            return true;
        }else {
            Log::WARN($data['out_trade_no'].'在pay_log表未查询到记录');
        
            return false;
        }
    }
    
}

?>